package com.christina.engine.response.model;

import com.christina.engine.intent.model.Intent;
import com.christina.engine.execution.model.ExecutionResult;
import lombok.Builder;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

/**
 * 响应上下文模型
 * 包含生成响应所需的所有信息
 * 
 * @author Christina
 */
@Data
@Builder
public class ResponseContext {
    
    /**
     * 请求ID
     */
    private String requestId;
    
    /**
     * 用户ID
     */
    private Long userId;
    
    /**
     * 会话ID
     */
    private String sessionId;
    
    /**
     * 原始用户输入
     */
    private String userInput;
    
    /**
     * 原始请求
     */
    private Object originalRequest;
    
    /**
     * 识别的意图
     */
    private Intent recognizedIntent;
    
    /**
     * 执行结果
     */
    private ExecutionResult executionResult;
    
    /**
     * 响应类型
     */
    private String responseType;
    
    /**
     * 请求时间
     */
    private LocalDateTime requestTime;
    
    /**
     * 响应时间
     */
    private LocalDateTime responseTime;
    
    /**
     * 用户偏好
     */
    private Map<String, Object> userPreferences;
    
    /**
     * 客户端信息
     */
    private Map<String, Object> clientInfo;
    
    /**
     * 额外的上下文数据
     */
    @Builder.Default
    private Map<String, Object> additionalData = new HashMap<>();
    
    /**
     * 添加额外数据
     * 
     * @param key 键
     * @param value 值
     */
    public void addData(String key, Object value) {
        if (additionalData == null) {
            additionalData = new HashMap<>();
        }
        additionalData.put(key, value);
    }
    
    /**
     * 获取额外数据
     * 
     * @param key 键
     * @param type 值类型
     * @return 值
     */
    @SuppressWarnings("unchecked")
    public <T> T getData(String key, Class<T> type) {
        if (additionalData == null) {
            return null;
        }
        
        Object value = additionalData.get(key);
        if (value == null) {
            return null;
        }
        
        if (type.isInstance(value)) {
            return (T) value;
        }
        
        return null;
    }
    
    /**
     * 检查是否包含指定的数据
     * 
     * @param key 键
     * @return 是否包含
     */
    public boolean hasData(String key) {
        return additionalData != null && additionalData.containsKey(key);
    }
}